package annotation.aop.test;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect //第一步：将横切关注点模块化，建立AspectJText类，并采用注解指定该类为Aspect，
public class MyInterceptor {
	/** 
	     * 定义Pointcut，Pointcut的名称为anyMethod()， 
	     * 此方法没有返回值和参数 
	     * 该方法就是一个标识，不进行调用 
	     * 括号里的表示任意个参数， 
	     * 当然可以不含参数 
	     */
	//这句话是方法切入点，execution为执行的意思，*代表任意返回值，然后是包名，.*意思是包下面的所有子包。
	//(..)代表各种方法.
	@Pointcut("execution(* annotation.aop.test.PersonServiceBean.*(..))")
	private void anyMethod(){}//第二步：定义一个切入点
	
	@Before("anyMethod() && args(name)")
	public void doAccessCheck(String name){
		System.out.println(name);
		System.out.println("前置通知");
	}
	
	@AfterReturning("anyMethod()")
	public void doAfter(){
		System.out.println("后置通知");
	}
	
	@After("anyMethod()")
	public void after(){
		System.out.println("最终通知");
	}
	
	@AfterThrowing("anyMethod()")
	public void doAfterThrow(){
		System.out.println("例外通知");
	}
	
	@Around("anyMethod()")
	public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("进入环绕通知");
		Object object = pjp.proceed();//执行该方法
		System.out.println("退出方法");
		return object;
	}
}
